5
תגובות

Multiple inheritance

פתח OrelBeY ,
אתם אומרים לי שב-Perl וב-Python יש תמיכה ב-Multiple inheritance, וב-PHP אין?

5 תשובות

avatar ענה Michael ב 25 לינואר 2013 #

לא. אבל יש לך traits, שנוסף בגירסא 5.4 וintval כתב לפני כמה חודשים מאמר על הנושא :)
כתבת את המושג באנגלית, אני מניח שלא מזמן שמעת עליו, אז אשאל את השאלה באיזה מקרים אתה חושב שאתה תצטרך להוריש כמה קלאסים בפעם אחת?
היי, אפילו סי שארפ וג'וואה לא נותנים לך אפשרות להוריש כמה מחלקות בפעם אחת.

avatar ענה OrelBeY ב 25 לינואר 2013 #

כן, לא ידעתי איך לומר את זה בעברית. :)
קרו לי כמה מקרים בעבר, אבל אני זוכר שבסוף איכשהו הסתדרתי... D:
אוקיי.

עריכה:
עד עכשיו לא ידעתי מה זה Traits (לא ידעתי שיש פה מדריך על זה). עכשיו אני מסודר. תודה. :-)
אז מה ההבדל בין trait למחלקה (חוץ ממתודות קסם וכדו')?

avatar ענה Michael ב 25 לינואר 2013 #

בהסבר קצת צולע, traits נועדו על מנת לכתוב מקבץ של מטודות "גלובאליות" שזה נועד בעצם למנוע שימוש חוזר בקוד או במילים אחרות, להפוך את המערכת שלך ליותר DRY.
לעומת מחלקות, אתה לא יכול ליצור instance חדש של trait.
בעיקרון כשאתה עושה שימוש בtraits אתה לא באמת מוריש את הטרייט הזה, אלא יותר "משכפל" לתוך המחלקה בה נעשה השימוש.

להסבר יותר מעמיק על הנושא ועל השימוש והמגבלות של traits אני מציע לך לקרוא ישר מהRFC:
https://wiki.php.net/rfc/horizontalreuse
או להסבר קצר מתוך הדוקו: http://www.php.net/manual/en/language.oop5.traits.php

avatar ענה iiddaannyy ב 26 לינואר 2013 #

ההבדל בין trait לבין מחלקה הוא מאוד פשוט:
קודם נצטרך להבין מתי אנחנו צריכים הורשה ומתי לא.
בהורשה נשתמש רק כאשר המחלקה היורשת היא בעצם סוג של מחלקת הבסיס, או מרחיבה את מחלקת הבסיס.

עכשיו ניקח מקרה שבו אנחנו רוצים ליצור מחלקת סינגלטון. מחלקה שכל מי שיירש אותה יהפוך אוטומטית לסינגלטון.
במה נשתמש - מחלקה או trait?
אנחנו לא נשתמש בהורשה (מחלקה) כי מחלקת הבסיס היא לא מסוג סינגלטון, היא לא מרחיבה את הסינגלטון.
לעומת זאת, אחת התכונות (traits) של המחלקה היא שהיא סינגלטון. ולכן נשתמש ב-trait (trait באנגלית = תכונה).

avatar ענה OrelBeY ב 26 לינואר 2013 #

נראה לי שהבנתי. תודה רבה לכם! :-)
iiddaannyy, זה בדיוק אחד המקרים שנתקלתי בהם פעם. (ואז הייתי צריך לעשות ידנית בכל אחד בנפרד. לא שהמקרה הזה יותר מדי מסובך, אבל בכל מקרה...)